import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;


public class Jeu {
//	private static final double probabiliteCreationLoup = 0.02;
//	private static final double probabiliteCreationMouton = 0.08;
	
	private List<Animal> animaux;
	private Grille grille;
	private int tour;//numero du tour
	
	
	//@param Tout est décidé par le joueur
   public Jeu(int hauteur,int largeur,int nbLoups,int nbMoutons){
		grille = new Grille(hauteur,largeur);
		System.out.println("la grille a ete creee");
		animaux = new ArrayList<Animal>();
		System.out.println(animaux.size());
		peupler(nbLoups, nbMoutons);
	}
   
    // Jouer pendant nombre de tours donnés en paramètre
    public void jouer (){
        while(estVivant()) joueUnTour();
        }

    // Permet de gérer un tour de jeu
    // Fait appel à la méthode act(List <Animal>) de la classe animaux qui gère leurs actions
    // Retire les animaux morts
    // Appelle fairePousser pour transformer les sels minéraux en herbe
    public void joueUnTour(){
        tour++;
        fairePousser();
        System.out.println("Tour N"+tour);

	        List<Animal> newAnimals = new ArrayList<Animal>();        
	        for(Iterator<Animal> it = animaux.iterator(); it.hasNext(); ) {
	            Animal animal = it.next();
	            animal.act(newAnimals);
	            if(!animal.estVivant()) {
	                it.remove();
	            }
	        }
	        animaux.addAll(newAnimals);
        
    }
    
    // Rajoute de l'herbe là où il y a des sels à chaque tour
    public void fairePousser(){
        for(int i = 0; i < grille.getHauteur(); i++) {
            for(int j = 0; j < grille.getLargeur(); j++) {
                Herbe herbe = grille.getHerbeAt(i,j);
                if(herbe.getSelMineral()){
                    herbe.pousse();
                }
            }
        }
    }
    
    // Retour à l'état initial
    public void reset(int nbLoupsCrees,int nbMoutonsCrees)
    {
        tour = 0;
        animaux.clear();
        peupler(nbLoupsCrees,nbMoutonsCrees);
    }
    
    
    //Ajoute des loup et des moutons de façon aléatoire
    private void peupler(int nbLoups,int nbMoutons){
        Random rand = Randomizer.getRandom();
        grille.clear();
        for (int nb=0; nb<nbLoups;nb++) {
        	int i = rand.nextInt(grille.getHauteur())+1;
        	int j=rand.nextInt(grille.getLargeur())+1;
        	Position pos = new Position(i, j);
            while (!grille.estPositionVide(pos)){
		    	i = rand.nextInt(grille.getHauteur())+1;
		    	j=rand.nextInt(grille.getLargeur())+1;
		    	pos=new Position(i, j);
            }
            Loup loup = new Loup(true, grille, pos);
            animaux.add(loup);
            System.out.println("Un loup N"+(nb+1)+" a ete cree sur la position " +pos+" .");
          }
        for (int nb=0; nb<nbMoutons;nb++) {
        	int i = rand.nextInt(grille.getHauteur())+1;
        	int j=rand.nextInt(grille.getLargeur())+1;
        	Position pos = new Position(i, j);
            while (!grille.estPositionVide(pos)){
		    	i = rand.nextInt(grille.getHauteur())+1;
		    	j=rand.nextInt(grille.getLargeur())+1;
		    	pos=new Position(i, j);
            }
            Mouton mout = new Mouton(true, grille, pos);
            animaux.add(mout);
            System.out.println("Un mouton N"+(nb+1)+" a ete cree sur la position " +pos+" .");
        }        
    }
    public Grille getGrille(){
    	return grille;
    }
    
    //@return Si l'univers est encore vivant
    public boolean estVivant(){
    	int nbLoupVivants=0, nbMoutonsVivants=0;
    	for(Iterator<Animal> it = animaux.iterator(); it.hasNext(); ) {
            Animal animal = it.next();
            if (animal instanceof Loup) nbLoupVivants+=1;
            else nbMoutonsVivants+=1;
            }
    	if (nbLoupVivants==0&&nbMoutonsVivants==0) return false;
    	else return true;
    	
    }
    
}
